#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project : python的学习
@File    : 面向对象-封装、继承、多态.py
@IDE     : PyCharm
@Author  : 春风十里
@Date    : 2023/6/26 15:14

'''


# 单继承
# 定义父类
class A:
    name1 = "父类的属性1"

    def aa(self):
        print("父类的方法1")


# 定义子类
class B(A):
    name2 = "子类属性1"

    def bb(self):
        print("子类方法1")


n = B()
print(n.name2)  # 调用子类的属性
n.bb()  # 调用子类的方法
print(n.name1)  # 调用父类的属性
n.aa()  # 调用父类的方法


# 多继承
# 定义父类A
class A:
    name_a = "父类A的属性1"

    def aa(self):
        print("父类A的方法1")


# 定义父类B
class B:
    name_b = "父类B的属性1"

    def bb(self):
        print("父类B的方法1")


# 定义子类C
class C(A, B):  # 继承两个父类
    pass  # 跳过


n = C()
print(n.name_a)
print(n.name_b)
n.aa()
n.bb()


# 方法覆盖
# 定义父类
class Animal:
    def eat(self):
        print("动物会吃东西")


# 定义子类狗
class dog(Animal):
    def eat(self):
        print("狗会吃东西")


d = dog()
d.eat()


# 定义父类Hero
class Hero:
    def stroke(self):  # 技能函数
        print("英雄技能")


# 定义子类程咬金
class ChengYaoJin(Hero):
    def stroke(self):  # 技能函数
        print("一技能跳跃，二技能旋转，大招回血")


# 定义子类后裔
class HouYi(Hero):
    def stroke(self):  # 技能函数
        print("一技能多发，二技能射圈，大招大鸟眩晕")


# 定义调用者
class Person:
    def chose_hero(self, hero):  # 玩家选择英雄
        hero.stroke()


c = ChengYaoJin()  # 程咬金
x = HouYi()  # 后裔
p = Person()  # 玩家
p.chose_hero(c)  # 玩家选择程咬金,"c"换成“x”就会产生不同的结果


# 定义鸟类
class Bird:
    def fly(self):
        print("鸟会飞")


# 定义飞机类
class Plane:
    def fly(self):
        print("飞机会飞")


# 定义火箭类
class Rocket:
    def fly(self):
        print("火箭会飞")


def fun1(obj):
    obj.fly()


fun1(Bird())  # 调用鸟类的fly方法
fun1(Plane())  # 调用飞机类的fly方法
fun1(Rocket())  # 调用火箭类的fly方法
